package com.blue.crawler.engine;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;

import com.blue.crawler.annotation.CrawlerConfig;
import com.blue.crawler.annotation.CrawlerPathConfig;
import com.blue.crawler.util.CrawlerInvoker;
import com.blue.crawler.util.HttpException;


/**
 * 爬虫引擎
 * 
 * @author zhengj
 * @since 1.0 2017年5月29日
 */
public interface Engine
{
	
	/**
	 * 处理网页信息或定义流程
	 * 
	 * @param html HTML文本
	 * @param config 爬虫配置
	 * @param page 当前页数
	 */
	void handle(String html, CrawlerConfig config, CrawlerPathConfig pathConfig, int page) throws Exception;
	
	/**
	 * 暂停爬虫
	 * 
	 * @param config 爬虫配置
	 */
	default void sleep(CrawlerConfig config)
	{
		if (config.getInterval() <= 0)
			return;
		
		try
		{
			Thread.sleep(config.getInterval() * 1000);
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
	
	/**
	 * 调用HTTP请求
	 * 
	 * @param invoker HTTP调用器
	 * @param url URL地址
	 * @param config 爬虫配置
	 * @return HTML文本
	 */
	default String invoke(CrawlerInvoker invoker, String url, CrawlerConfig config, CrawlerPathConfig pathConfig) throws IOException, HttpException
	{
		Proxy proxy = null;
		if (config.isProxy())
		{
			InetSocketAddress addr = new InetSocketAddress(config.getProxyHost(), config.getProxyPort());
			proxy = new Proxy(config.getProxyType(), addr);
		}
		return invoker.get(url, proxy, pathConfig.getHeaders());
	}
	
}
